function res = GetXeDriving(obj, varargin)
    p=inputParser;
    p.addOptional('amplitude129', 3e-3, @(x) x>=0.0 && x<=2.0);
    p.addOptional('amplitude131', 40e-3, @(x) x>=0.0 && x<=2.0);
    p.addParameter('detuning129', 0.0, @isnumeric);
    p.addParameter('detuning131', 0.0, @isnumeric);
    p.addParameter('recordTime', 0, @(x) x>=0);
    p.addParameter('preDrivingTime', 5.0, @(x) x>0);
    p.addParameter('rate', 1, @(x) x>0);
    p.addParameter('isReport', false, @islogical);
    p.addParameter('isPlot', true, @islogical);
    p.addParameter('description', 'No description.', @ischar);
    p.parse(varargin{:});
    
    try
        freq129 = obj.SystemInfo.Xe129FID.f129;
        freq131 = obj.SystemInfo.Xe131FID.f131;
    catch
        error('Cannot get Central frequency.');
    end
    
    obj.setParametricMagnetometer('isLockTransverseField', true);
    obj.setNMR('amplitude129', p.Results.amplitude129, 'amplitude131', p.Results.amplitude131);
    
    if p.Results.recordTime > 0
        tm = timer('ExecutionMode', 'singleShot', 'StartDelay', p.Results.preDrivingTime);
        tm.TimerFcn = @(myTimerObj, thisEvent) drvXe(obj, freq129 + p.Results.detuning129, p.Results.amplitude129,...
                                                          freq131 + p.Results.detuning131, p.Results.amplitude131);
        start(tm);
        
        sg = MeasurementComponent.Signal.SignalGroup('XeDrivingGroup');
        sg.subscribe_signal(obj.Xe129,  ziDemodTime.R, [2, 2, 1]);
        sg.subscribe_signal(obj.Xe131,  ziDemodTime.R, [2, 2, 2]);
        sg.subscribe_signal(obj.Xe129,  ziDemodTime.Theta, [2, 2, 3]);
        sg.subscribe_signal(obj.Xe131,  ziDemodTime.Theta, [2, 2, 4]);
        signal = sg.getDemodSignal(p.Results.recordTime+p.Results.preDrivingTime, 'rate', p.Results.rate);

        delete(tm);

        %%
        res.timestamp = datetime('now');
        res.signal = signal;
        res.amplitude129 = p.Results.amplitude129;
        res.amplitude131 = p.Results.amplitude131;
        res.detuning129 = p.Results.detuning129;
        res.detuning131 = p.Results.detuning131;
        obj.SystemInfo.XeDriving = res;
        
        %%
        if p.Results.isPlot
            fig = obj.PlotXeDriving();
        end
        %%
        if p.Results.isReport
            getReporter;
            rpt.NewRecord(['XeDriving_' p.Results.description]);
            if p.Results.isPlot
                rpt.AppendFigure(fig, sprintf('XeDriving %s', p.Results.description));
            end
        end
        
        getSession;
        sess.addData('XeDriving', res, p.Results.description);
    else
        drvXe(obj, freq129 + p.Results.detuning129, p.Results.amplitude129,...
                   freq131 + p.Results.detuning131, p.Results.amplitude131);
        res = [];
    end
    
end

function drvXe(obj, freq129, amp129, freq131, amp131)
    obj.setNMR('frequency129', freq129, 'frequency131', freq131);
    if amp129 > 0.0
        obj.by129.setAC('frequency', freq129, 'amplitude', amp129, 'range', 10.0);
    end
    
    if amp131 > 0.0
        obj.by131.setAC('frequency', freq131, 'amplitude', amp131, 'range', 10.0);
    end
end

